有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

如何编写Java字符串。格式化为ruby代码?

如何用ruby编写此代码?我听不懂字符串。格式(“%04d”,validateHash(散列)?((0xFC &;散列[0])<&书信电报;5) |(hash[hash.length-1]&;0x7F):0)

private static final int MINIMUM_HASH_LENGTH = 20;

public static String calculateVerificationCode(byte[] hash) {
    return String.format("%04d", validateHash(hash) ? ((0xFC & hash[0]) << 5) | (hash[hash.length - 1] & 0x7F) : 0);
}

private static boolean validateHash(byte[] hash) {
    return hash != null && hash.length >= MINIMUM_HASH_LENGTH;
}

共 (1) 个答案

  1. # 1 楼答案

    让我们一步一步地讨论比特运算

    让我们假设我们的散列是"some_string",字节表示是:

    input = "some_string"
    hash = input.bytes
    # -> [115, 111, 109, 101, 95, 115, 116, 114, 105, 110, 103]
    

    第一部分是获取数组的第一个字节115,并对252执行按位and运算(FC252的十六进制表示形式)。如果我们将其转换为二进制,它将如下所示:

    (0xFC & hash[0]):
    0011111100
    0001110011
           -
    0001110000
    

    结果将向左移动5

    0001110000 -> 000111000000000
    

    下一步是获取数组的最后一个元素并执行按位and(&;)使用1277F127的十六进制表示形式)的操作

    (hash[hash.length - 1] & 0x7F):
    0001100111
    0001111111
           -
    0001100111
    

    最后一步是获取这两个结果并执行按位OR运算

    ((0xFC & hash[0]) << 5) | (hash[hash.length - 1] & 0x7F)
    000111000000000
    000000001100111
           -
    000111001100111
    

    如果我们将其转换为整数,我们将得到3687

    神奇的数字127和252可能是精心挑选的,以保证良好的分布,所以请将它们视为给定值。我们需要从何处获取更多信息来解释这些值

    验证还确保哈希至少有20个字节,否则这些操作可能无法生成良好的分发

    整个Ruby代码如下所示:

    def calculateVerificationCode(hash)
      return 0 unless hash&.length >= 20
    
      (((0xFC & hash[0]) << 5) | (hash[hash.length - 1] & 0x7F)).to_s.rjust(4, "0")
    end
    
    puts calculateVerificationCode("a really long string foobar".bytes)
    

    如果数字小于1000,则to_s.rjust(4, "0")确保在左侧用零填充